Skip to content

fix(reader): 移动端阅读设置面板补「音量键翻页」开关 / Add missing volume-key paging toggle to mobile reader settings#380

Open
chy5301 wants to merge 1 commit into
codedogQBY:mainfrom
chy5301:fix/mobile-volume-paging-toggle
Open

fix(reader): 移动端阅读设置面板补「音量键翻页」开关 / Add missing volume-key paging toggle to mobile reader settings#380
chy5301 wants to merge 1 commit into
codedogQBY:mainfrom
chy5301:fix/mobile-volume-paging-toggle

Conversation

@chy5301
Copy link
Copy Markdown
Contributor

@chy5301 chy5301 commented Jun 6, 2026

问题

移动端音量键翻页的核心逻辑(useVolumeButtonPaging.ts)、原生桥接(VolumeManager)、启用条件(ReaderScreen.tsx)、设置字段(volumeButtonsPageTurn,默认 false)、i18n 文案(settings.volumeButtonsPageTurn)均已就位,唯独 ReaderSettingsPanel.tsx 缺少对应的开关 UI,导致用户永远无法启用该功能。

Closes #379

改动

packages/app-expo/src/screens/reader/ReaderSettingsPanel.tsx(+12 行):

  1. readSettings 解构新增 volumeButtonsPageTurn 字段;
  2. 在「阅读模式」与「顶部标题与进度」之间插入 toggle 行,复用现有 toggle 模式,文案复用现成的 t("settings.volumeButtonsPageTurn")

无新增依赖、无样式/类型变更。

验证

  • Biome 检查通过(既有 RubySettingsRow 格式警告与本次无关);
  • ReadSettings 类型已含 volumeButtonsPageTurn(packages/core/src/types/book.ts:95),onUpdateSetting 类型安全;
  • 插入位置与同级 toggle 视觉一致,无新增样式。

音量键翻页的核心逻辑、原生桥接、i18n 文案均已就位,但
ReaderSettingsPanel 缺少对应的 toggle,设置项默认 false 且
无 UI 入口可改,导致功能不可达。在「阅读模式」与「顶部
标题与进度」之间插入开关行,复用现有 toggle 模式。

Closes codedogQBY#379
@chy5301
Copy link
Copy Markdown
Contributor Author

chy5301 commented Jun 6, 2026

Hi @codedogQBY,这个 PR 修复的是一个移动端基本可用性问题——音量键翻页的核心逻辑、原生桥接、i18n 文案早已全部就位,唯独设置面板漏接了一个 toggle 开关(默认 false 且无任何 UI 入口可改),导致整个功能对用户完全不可达。

移动端阅读场景下,音量键翻页是刚需——单手握持时无需抬手触屏即可翻页,没有这个功能的版本在移动端体验上几乎不可用。改动仅 +12 行,风险极低,请尽快核实确认并合并,建议同步更新版本以尽早覆盖已安装用户。

相关:Fixes #379 / 补充 issue #381(设置面板溢出隐患,可后续处理)

@codedogQBY
Copy link
Copy Markdown
Owner

这个有测过了吗?之前音量翻页有奔溃性bug,所以给隐藏了

@chy5301
Copy link
Copy Markdown
Contributor Author

chy5301 commented Jun 7, 2026

没特别仔细测,我晚点再看看吧> 这个有测过了吗?之前音量翻页有奔溃性bug,所以给隐藏了

@chy5301
Copy link
Copy Markdown
Contributor Author

chy5301 commented Jun 7, 2026

关于这个 PR 卡住的崩溃顾虑,我做了一轮静态源码核查(读了依赖库 react-native-volume-manager 实际安装的原生码 + 上游仓库源码,未做真机复现),根因基本查明,完整写在 #382,这里给个 PR 维度的结论:

  • 崩溃不是这个 PR(补开关)的问题,也不是 JS 层的问题:根因在依赖库 VolumeManagerModule.java 注册音量广播那行 registerReceiver 缺了 Android 14 (API 34) 必需的 RECEIVER_NOT_EXPORTED flag 且无 try/catch,在 targetSdk≥34(本项目 35)的 Android 14/15 上抛未捕获 SecurityException 原生闪退;Android 13- 不崩——正对应你说的「部分机型」。JS 的 try/catch 拦不住原生异常,这也是当初难定位的原因。
  • 核实了上游库:这行在库 main 至今未修;库本身还在维护(GitHub 6 月初刚发 v2.1.1),但 npm 的 latest 仍停在 2.0.8(上游 反馈 #62 在催),所以升级也绕不开,需 app 侧自己打补丁(patches/ 机制现成)。
  • 对本 PR 的提醒:正因根因没随本 PR 修复,若现在直接合、Android 14+ 用户打开开关仍会闪退。所以建议别让本 PR 单独合,而是二选一——① 在本 PR 追加给那行 registerReceiver 补 flag 的 patch(最小止血);② 先单独修根因、再合开关。
  • 另外加回开关前还牵涉一个 iOS 取舍(现状 iOS 能用、Android 会崩;而「拦截按键」的治本方案反而 iOS 不支持),细节在 [Bug] 音量键翻页在 Android 14+ 闪退的真正根因:依赖库 react-native-volume-manager 的 registerReceiver 缺 Android 14 receiver flag(非 app/JS 层问题,附标准修法) #382,方向你定,我可以配合改。

(声明:以上为静态分析结论,尚无线上崩溃堆栈实证,建议在 Android 14/15 真机/模拟器 adb logcat 抓一次坐实,见 #382「待确认」。)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants